// campus_login_def.h
#pragma once

#include <string>
#include <websocketpp/server.hpp>
#include <nlohmann/json.hpp>
#include "../sql/campus_sql_define.h"

using json = nlohmann::json;

const std::string SIGNAL_TYPE_LOGIN = "login";
const std::string SIGNAL_TYPE_RESP_LOGIN = "resp_login";

const std::string SIGNAL_TYPE_LOGIN_SALT = "login_salt";
const std::string SIGNAL_TYPE_RESP_LOGIN_SALT = "resp_login_salt"; //服务端回复登录

const std::string SIGNAL_TYPE_REGISTER = "register";
const std::string SIGNAL_TYPE_RESP_REGISTER = "resp_register"; //服务端回复注册

const std::string SIGNAL_TYPE_LOGOUT = "logout";
const std::string SIGNAL_TYPE_RESP_LOGOUT = "resp_logout"; //服务端回复退出

// 登录/注册/登出返回状态
enum class CampusLoginRet {
    // 服务端回复登录查询（Salt）
    LOGIN_RET_SALT_SUCCESS,
    LOGIN_RET_NOT_EXIST,

    // 服务端回复登录校验
    LOGIN_RET_SUCCESS,
    LOGIN_RET_FAIL,

    // 服务端回复注册查询
    REGISTER_RET_SUCCESS,
    REGISTER_RET_EXIST,

    // 服务端回复退出请求
    LOGOUT_RET_SUCCESS,
    LOGOUT_RET_FAIL,
    LOGOUT_RET_EXISTS
};

// SQL操作类型（登录相关）
enum class CampusLoginSqlType {
    LOGIN_SQL_SELECT_LOGIN_SALT,  // 查询登录Salt
    LOGIN_SQL_SELECT_LOGIN,       // 登录校验查询
    LOGIN_SQL_SELECT_REGISTER_INFO, // 注册前检查UID是否存在
    LOGIN_SQL_INSERT_REGISTER_INFO  // 插入注册信息
};

// 登录业务数据载体（传递SQL参数、结果回调数据）
struct CampusLoginInfo : public CampusSqlInfo {
    CampusLoginSqlType type;               // SQL操作类型

    std::string uid;                       // 用户ID
    std::string salt;                      // 盐值
    std::string hash;                      // 加密后的密码

    virtual void dummpy_func() override {}
};

struct CampusLoginServerObserver{
    virtual void handleLogin(websocketpp::connection_hdl hdl,json const JMsg) {}
    virtual void handleLoginSalt(websocketpp::connection_hdl hdl,json const JMsg ) {}
    virtual void handleRegister(websocketpp::connection_hdl hdl,json const JMsg) {} 
    virtual void handleLogout(websocketpp::connection_hdl hdl,json const JMsg) {}

    virtual void handleHdlClose(websocketpp::connection_hdl hdl) {}
};